package cn.doitedu.javase.io;


import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;

import java.io.FileReader;
import java.io.FileWriter;
import java.util.*;

public class _06_FileReader和FileWriter综合编程案例 {
    public static void main(String[] args) throws Exception {

        /* *
         * 一、往文件中循环写入10000条模板数据
         */
        //  {"user_id":1,"event_id":"a","action_time":1706758396000}
        //  {"user_id":2,"event_id":"b","action_time":1706758396000}
        //  {"user_id":1,"event_id":"a","action_time":1706758396000}

        String actionLogTemplate = "{\"user_id\":${1},\"event_id\":\"${2}\",\"action_time\":${3}}";
        String[] eventIds = new String[]{"a","b","c","d"};
        Random random = new Random();
        FileWriter fileWriter = new FileWriter("e:/logs.txt");

        for(int i=0;i<10;i++){
            String user_id = random.nextInt(1000)+"";
            String event_id = eventIds[random.nextInt(eventIds.length)];
            String action_time = System.currentTimeMillis()+"";

            String replace1 = actionLogTemplate.replace("${1}", user_id);
            String replace2 = replace1.replace("${2}", event_id);
            String replace3 = replace2.replace("${3}", action_time);

            fileWriter.write(replace3+"\n");

        }

        fileWriter.close();


        /**
         * 二、从文件中读取刚才生成的数据
         * 统计每一种事件，发生的人数
         */



        FileReader fileReader = new FileReader("e:/logs.txt");
        char[] chars = new char[1];
        int read;

        // 开辟一个数组，用来缓存一行char
        char[] buffer = new char[1024];
        int bufferIdx = 0;


        // 开辟一个HashMap<String,Set<Integer>> ，用来记录每一种事件，都有那些用户发生
        HashMap<String, Set<Integer>> countMap = new HashMap<>();

        // 先按一次一个字符的节奏读
        while(  (read=fileReader.read(chars))!=-1   ){
            // 取出本次读到的一个字符
            char aChar = chars[0];

            // 判断读到的字符是否是一个回车符
            if(aChar == '\n'){


                // 如果是一个回车符，说明已经读满了一行char，那就把缓存好的这一行char转成字符串
                String json = new String(buffer, 0, bufferIdx);

                // 缓存的index指针要重置到数组头
                bufferIdx = 0;

                /**
                 * 开始计算这条json
                 */
                if(!json.trim().isEmpty()) {

                    // 1. 提取json中的事件id和user_id
                    JSONObject jsonObject = JSON.parseObject(json);
                    int userId = jsonObject.getIntValue("user_id");
                    String eventId = jsonObject.getString("event_id");

                    // 2. 从hashmap中get这个event_id对应的hashSet集合
                    Set<Integer> userIdSet = countMap.get(eventId);

                    // 如果该事件还没有记录过，那么取到的set是一个null
                    if (userIdSet == null) {
                        // 要给他新创建一个set集合对象
                        userIdSet = new HashSet<>();
                    }

                    // 往set集合中添加本次事件的userId
                    userIdSet.add(userId);

                    // 3.将更新后的set集合，放回hashmap
                    countMap.put(eventId, userIdSet);
                }
            }else{
                // 如果不是一个回车符，那就把这个读到的字符，放入缓冲存起来,缓存index指针++
                buffer[bufferIdx] = aChar;
                bufferIdx++;

            }
        }

        fileReader.close();



        /* *
         * 三、从countMap中遍历结果
         * 把统计的结果，写入另一个文件
         */

        FileWriter fileWriter1 = new FileWriter("e:/result.txt");

        Set<Map.Entry<String, Set<Integer>>> entries = countMap.entrySet();
        for (Map.Entry<String, Set<Integer>> entry : entries) {
            String eventId = entry.getKey();
            Set<Integer> userIdSet = entry.getValue();

            // 计算该事件的行为人数
            int userCount = userIdSet.size();

            // 输出结果
            fileWriter1.write(eventId+" ==> " + userCount +"\n");

        }

        fileWriter1.close();

    }
}
